package game

import (
	"github.com/name5566/leaf/log"
	"github.com/name5566/leaf/gate"
	"message"
)

type object interface{}

func init() {
	// gate底层会调用
	skeleton.RegisterChanRPC("NewAgent", rpcNewAgent)
	skeleton.RegisterChanRPC("CloseAgent", rpcCloseAgent)

	// 登录服务器调用
	skeleton.RegisterChanRPC("UserLogin", rpcUserLogin)
}

type AgentInfo struct {
	Account string
	UserID  int
}

// 新建立一个连接
func rpcNewAgent(args []interface{}) {
	log.Debug("rpcNewAgent")
	a := args[0].(gate.Agent)
	a.SetUserData(new(AgentInfo))
}

// 一个连接已关闭
func rpcCloseAgent(args []interface{}) {
	log.Debug("rpcCloseAgent")
	a := args[0].(gate.Agent)

	// 还没有连上的客户端，不用处理
	account := a.UserData().(*AgentInfo).Account
	if account == "" {
		a.SetUserData(nil)
		return
	}

	// 处理玩家登出
	user := GetUserByAccount(account)
	if user != nil {
		log.Debug("account %v logout", account)
		user.logout()
	}

	a.SetUserData(nil)
}

// 玩家登陆，账号服务器验证账号密码后，发送到游戏服务器请求登录
func rpcUserLogin(args []interface{}) {
	a := args[0].(gate.Agent)    // 客户端的连接
	account := args[1].(string)    // 账号
	token := args[2].(string)    // 有效性token

	log.Debug("玩家%v  请求登录", account)

	_ = message.MSG_ERROR
	// 重复登录（踢掉已登录的玩家）
//	if oldUser, ok := account2Users[account]; ok {
//		log.Error("rpcUserLogin dup login:  %v", oldUser.data.Account)
//		oldUser.SendError(message.MSG_ERROR, message.ErrorCode_ERR_LOGIN_REPEAT)
//		oldUser.logout()
//		oldUser.Close()
//		return
//	}

	log.Debug("用户登录 %v", account)

	// login 创建新的玩家
	newUser := new(User)
	newUser.Agent = a
	newUser.LinearContext = skeleton.NewLinearContext()
	newUser.onlineStatus = USER_STATE_LOGIN

	// 给agent附好值，以便识别agent是哪个玩家
	newUser.Agent.UserData().(*AgentInfo).Account = account

	// 玩家登录，登录成功会自动把玩家加入到在线玩家列表中
	newUser.login(account, token)
}